package com.gxc.binarySystem;

/**
 * 给定一个函数f，可以1~5的数字等概率返回一个。请加工出1~7的数字等概率返回一个的函数g。
 * 首选构造一个等概率返回0,1的函数
 * 1-7  =  0-6 +1
 * 0-6 转成二进制  011
 */
public class EqualProbability {

    public static void main(String[] args) {
        System.out.println(g());
    }

    public static int f() {
        return (int) (Math.random()*5+1);
    }

    /**
     * 把1-5  构造成  等概率返回0,1的函数
     * 1 2  返回0
     * 4 5  返回1
     * 3 则再次循环判断
     * @return
     */
    public static int zeroAndOne() {
        int i = f();
        while (i==3) i = f();
        return i<3?0:1;
    }

    public static int g() {
        int i = (zeroAndOne()<<2) + (zeroAndOne()<<1) + zeroAndOne();
        while (i==7) {
            i = (zeroAndOne()<<2) + (zeroAndOne()<<1) + zeroAndOne();
        }
        return i+1;
    }

}
